import java.awt.FlowLayout;//
import java.awt.Font;//字体类，用于设置文本组件的字体。
import java.awt.GridLayout;//网格布局管理器，将容器分割成网格，每个网格中放置一个组件。
import java.awt.event.ActionEvent;//事件类，封装了动作事件的信息。
import java.awt.event.ActionListener;//接口，用于接收动作事件（如按钮点击）。
import java.io.File;//文件和目录路径名的抽象表示形式。
import java.io.FileOutputStream;//文件输出流，用于将数据写入文件。
import java.io.OutputStreamWriter;//字符输出流，用于将字符流转换为字节流，以便写入到文件中。
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;
import javax.swing.JButton;//按钮组件。
import javax.swing.JComboBox;//下拉列表组件。
import javax.swing.JDialog;//对话框窗口。
import javax.swing.JLabel;//标签组件，用于显示文本或图像。
import javax.swing.JOptionPane;//
import javax.swing.JPanel;//面板组件，用于组织其他组件的布局。
import javax.swing.JTextField;//文本字段组件，用于输入单行文本。
import javax.swing.table.DefaultTableModel;//默认的表格模型，用于JTable
import javax.swing.table.TableColumn;//



public class MyDialog extends JDialog implements ActionListener {
//实现了AL接口意味可以用这个类处理动作事件
	private static final long serialVersionUID = 1L;//这是一个序列化版本唯一标识符。
	//当你将对象序列化到文件或网络时，JVM使用这个标识符来验证发送方和接收方加载的类是否匹配。这里的1L是一个长整型字面量。
	private Connect dbconn = new Connect();//用于数据库连接，初始化
	private static String id;//编号
	private JPanel pCenter, pSouth;//psouth 用于放置操作按钮；
	private JLabel nameLab, sexLab, mailLab, birthLab, phoneLab,noteLab,dormLab,addressLab;//
	private JTextField nameText, mailText, birthText, phoneText,noteText,dormText,addressText;
	private JComboBox<String> sex;//选择性别
	private JButton yesBtn, noBtn;
	
	public MyDialog() {}//默认的构造函数
	
	public MyDialog(String title, Map<String, String> info) {
		id = info.get("id");
		if("删除联系人".equals(title)) {
			deletePerson();//初始化
		}else {
			Font font = new Font("宋体", Font.BOLD, 14);
			String[] sexType = { "-请选择-","男", "女" };//下拉列表组件选择
			pCenter = new JPanel();
			pCenter.setLayout(new GridLayout(8, 1));//中心面板设置布局为8行1列
			mailLab = new JLabel("学号：");
			nameLab = new JLabel("姓名：");
			sexLab = new JLabel("性别：");
			birthLab = new JLabel("生日：");
			noteLab = new JLabel("政治面貌：");
			phoneLab = new JLabel("电话：");
			dormLab=new JLabel("宿舍号：");
			addressLab=new JLabel("住址：");
			
			nameLab.setFont(font);
			sexLab.setFont(font);
			mailLab.setFont(font);
			birthLab.setFont(font);
			phoneLab.setFont(font);
			noteLab.setFont(font);
			dormLab.setFont(font);
			addressLab.setFont(font);
			
			nameText = new JTextField(10);//输入文本
			mailText = new JTextField(10);
			birthText = new JTextField(10);
			phoneText = new JTextField(10);
			noteText = new JTextField(10);
			dormText = new JTextField(10);
			addressText = new JTextField(10);
			sex = new JComboBox<String>(sexType);//性别选择

			JPanel jp1 = new JPanel();
			jp1.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp1.add(nameLab);//显示姓名
			jp1.add(nameText);//输入姓名

			

			JPanel jp2 = new JPanel();
			jp2.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp2.add(mailLab);
			jp2.add(mailText);//接收输入的mail
			mailText.setText(info.get("mail"));

			JPanel jp3 = new JPanel();
			jp3.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp3.add(birthLab);
			jp3.add(birthText);
			birthText.setText(info.get("birthday"));

			JPanel jp4 = new JPanel();
			jp4.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp4.add(phoneLab);
			jp4.add(phoneText);
			phoneText.setText(info.get("telephone"));
			
			JPanel jp5 = new JPanel();
			jp5.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp5.add(sexLab);
			jp5.add(sex);

			sex.setSelectedItem(info.get("sex"));//下拉选择性别
			
			JPanel jp6 = new JPanel();
			jp6.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp6.add(noteLab);
			jp6.add(noteText);
			noteText.setText(info.get("note"));
			
			JPanel jp7 = new JPanel();
			jp7.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp7.add(dormLab);
			jp7.add(dormText);
			noteText.setText(info.get("dorm"));
			

			JPanel jp8 = new JPanel();
			jp8.setLayout(new FlowLayout(FlowLayout.LEFT));
			jp8.add(addressLab);
			jp8.add(addressText);
			noteText.setText(info.get("address"));
			
			
			pCenter.add(jp1);
			pCenter.add(jp2);
			pCenter.add(jp3);
			pCenter.add(jp4);
			pCenter.add(jp5);
			pCenter.add(jp6);
			pCenter.add(jp7);
			pCenter.add(jp8);//将各个面板添加到pCenter中

			pSouth = new JPanel();
			yesBtn = new JButton("以数据库保存");
			yesBtn.addActionListener(this);//事件监听器
			noBtn = new JButton("以文件保存");
			noBtn.addActionListener(this);
			pSouth.add(yesBtn);//将yesBtn按钮添加到pSouth面板上
			pSouth.add(noBtn);//同上

			this.add(pCenter, "Center");//将pCenter面板添加到当前容器的"Center"区域
			this.add(pSouth, "South");

			this.setTitle(title);
			this.setSize(400, 450);
			this.setLocationRelativeTo(null);//将窗口置于屏幕中央
			this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);//关闭窗口的
		}
	}

	public void actionPerformed(ActionEvent e) {//系统功能按钮监听器
		if (e.getSource() == yesBtn) {
			if (this.getTitle().equals("新建学生信息")) {
				dbinsertPerson();//调用方法将学生信息插入数据库
			} else if (this.getTitle().equals("修改学生信息")) {
				updatePerson();//更新数据内容
			} else if (this.getTitle().equals("删除学生信息")) {
				deletePerson();//删除数据库中学生信息
			}
		} else if (e.getSource() == noBtn) {
			fileinsertPerson();//保存到文件中？没懂
		}
	}

	public void insertPerson() {//如果输入为空将进行提示
		if (nameText.getText().isEmpty()) {
			JOptionPane.showMessageDialog(null, "请输入姓名！");//提示弹窗
			return;
		}
	}

	public void dbinsertPerson(){//将新建的学生信息写入数据库的表中
		boolean flag=true;
		String sql = "insert into my_address_book(name, sex, telephone, mail, birthday, note,address,dorm)value(?,?,?,?,?,?,?,?)";
		try {
			//PreparedStatement 对象已预编译过，所以其执行速度要快于 Statement 对象,多次执行的 SQL 语句经常创建为 PreparedStatement 对象，以提高效率。作为 Statement 的子类，PreparedStatement 继承了 Statement 的所有功能
			PreparedStatement pstmt = dbconn.getConnection().prepareStatement(sql);
			pstmt.setString(1, nameText.getText());
			pstmt.setString(2, (String) sex.getSelectedItem());
			pstmt.setString(3, phoneText.getText());
			pstmt.setString(4, mailText.getText());
			pstmt.setString(5, birthText.getText());
			pstmt.setString(6, noteText.getText());
			pstmt.setString(7, addressText.getText());
			pstmt.setString(8, dormText.getText());
			pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "新建学生信息失败！");//提示弹窗
			flag = false;
		} finally {
			dispose();
			if (flag) {
				JOptionPane.showMessageDialog(null, "新建学生信息成功！");//提示弹窗
			}
			StudentSystem.flashInfo();//将数据写入数据库,与数据相关的代码基本都是借鉴，尝试了很久
			DefaultTableModel model = new DefaultTableModel(StudentSystem.info, StudentSystem.column);

			StudentSystem.infoTable.setModel(model);
			TableColumn column1 = StudentSystem.infoTable.getColumnModel().getColumn(0);
			column1.setMaxWidth(40);
			column1.setMinWidth(40);
			
			TableColumn column3 = StudentSystem.infoTable.getColumnModel().getColumn(2);
			column3.setMaxWidth(40);
			column3.setMinWidth(40);
		}
	}
	
	public void fileinsertPerson(){//将新建的学生信息写入文件中
		boolean flag=true;
		try {
		
			StringBuffer sbf=new StringBuffer();
			sbf.append(nameText.getText()).append(" ")
			.append((String) sex.getSelectedItem()).append(" ")
			.append(phoneText.getText()).append(" ")
			.append(mailText.getText()).append(" ")
			.append(birthText.getText()).append(" ")
			.append(noteText.getText()).append(" ")
			.append(addressText.getText()).append(" ") 
			.append(dormText.getText()).append(" ")	;
			File file = new File("information.txt");
            FileOutputStream fos = null;
            if(!file.exists()){
                file.createNewFile();//如果文件不存在，就创建该文件
                fos = new FileOutputStream(file);//首次写入获取
            }else{
                //如果文件已存在，就在文件末尾追加写入
                fos = new FileOutputStream(file,true);
            }
            OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk");//指定以UTF-8格式写入文件
            osw.write(sbf.toString());
            osw.write("\r\n");
            osw.close();
		} catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "新建学生信息失败！");//提示弹窗
			flag = false;
		} finally {
			dispose();
			if (flag) {
				JOptionPane.showMessageDialog(null, "新建学生信息成功！");//提示弹窗
			}
		}
	}
	
	public void deletePerson() {//删除信息
		String sql = "delete from my_address_book where id=?";

		try {
			
			PreparedStatement pstmt = dbconn.getConnection().prepareStatement(sql);
			pstmt.setString(1, id);//1表示参数位置
			pstmt.executeUpdate();//删除学生信息
		} 
		catch (SQLException e) {
			e.printStackTrace();
		} finally {
			dispose();//删除
			StudentSystem.flashInfo();
			DefaultTableModel model = new DefaultTableModel(StudentSystem.info, StudentSystem.column);
			JOptionPane.showMessageDialog(null, "删除成功！");
			StudentSystem.infoTable.setModel(model);
			TableColumn column1 = StudentSystem.infoTable.getColumnModel().getColumn(0);
			column1.setMaxWidth(40);//面板最大宽度
			column1.setMinWidth(40);

			TableColumn column3 = StudentSystem.infoTable.getColumnModel().getColumn(2);
			column3.setMaxWidth(40);
			column3.setMinWidth(40);
		}
	}

	public void updatePerson() {//修改信息
		if (nameText.getText().isEmpty()) {
			JOptionPane.showMessageDialog(null, "请输入姓名！");//提示弹窗
		}
		String sql = "update my_address_book set name=?,sex=?,telephone=?,number=?,birthday=?,note=? ,address=?,dorm=?where id=?";

		try {
			//更新数据
			PreparedStatement pstmt = dbconn.getConnection().prepareStatement(sql);
			pstmt.setString(1, nameText.getText());
			pstmt.setString(2, (String) sex.getSelectedItem());
			pstmt.setString(3, phoneText.getText());
			pstmt.setString(4, mailText.getText());
			pstmt.setString(5, birthText.getText());
			pstmt.setString(6, noteText.getText());
			pstmt.setString(7, addressText.getText());
			pstmt.setString(8, dormText.getText());
			pstmt.setString(9, id);
			pstmt.executeUpdate();
		} catch (SQLException e) {
			//OptionPane.showMessageDialog();
			e.printStackTrace();//异常处理
		} finally {
			//dispose();
			StudentSystem.flashInfo();//显示消息
			DefaultTableModel model = new DefaultTableModel(StudentSystem.info, StudentSystem.column);
			
			StudentSystem.infoTable.setModel(model);//更新了数据内容
			TableColumn column1 = StudentSystem.infoTable.getColumnModel().getColumn(0);
			column1.setMaxWidth(40);
			column1.setMinWidth(40);

			TableColumn column3 = StudentSystem.infoTable.getColumnModel().getColumn(2);
			column3.setMaxWidth(40);
			column3.setMinWidth(40);
		}
	}
}